<?php
namespace app\api\controller;
use think\Controller;
use think\Db;

class Payment
{
    //订单支付
    public function index(){
        //验证数据提交密钥
        //获取订单id
        $order_id = input('post.id','');
        if (!$order_id){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //获取订单信息
        $order = get_order($order_id,session('user.id'));
        if (!$order){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        // 验证订单是否已支付 -1未支付
        if($order['is_state'] == -1){
            $data = array();
            //获取订单使用优惠券
            $data['item_id'] = input('post.item_id','');
            //清除已过期的优惠券
            if (Db::name('coupon_items')->where(array('is_state' => 0, 'end_time' => array('LT', time())))->count() > 0) {
                Db::name('coupon_items')->where(array('is_state' => 0, 'end_time' => array('LT', time())))->setField('is_state', 2);
            }
            //查询符合条件数据
            $cpns_money = 0;
            $coupon = get_member_coupon(session('user.id'));
            //获取优惠券抵扣金额
            if($coupon){
                foreach ($coupon as $value) {
                   if($value['is_state'] == 0 && $value['item_id'] == $data['item_id'] && $value['freeze'] == 0 && $value['min_order_amount'] <= $order['total_price'] && $value['max_order_amount'] >= $order['total_price']){
                        $cpns_money = $value['cpns_money'];
                   }
                }
            }
            //获取订单使用菜币
            $data['point'] = input('post.point/d','');
            $point = 0;
            //获取菜币抵扣金额
            if(Db::name('member')->where(array('id'=>session('user.id'),'point'=>array('EGT', $data['point'])))->count() > 0){
                //获取网站用户设置信息
                $config = get_config(4);
                //菜币计算比例
                $point = $data['point'] / $config['ratio'];
            }
            //获取订单选择收货地址
            $data['address'] = input('post.address','');
            //获取收货地址信息
            $address = array();
            if (!get_address(session('user.id'))){return json(array('success'=>false,'info'=>'请添加收货地址'));exit;} 
            foreach (get_address(session('user.id')) as $value) {
                if($value['id'] == $data['address']){
                    $address = $value;
                }
            }
            if (!$address){return json(array('success'=>false,'info'=>'请选择收货地址'));exit;} 
            //计算商品配送费用
            $freight_price = 0;
            foreach (unserialize($order['goods']) as $value) {
                //计算商品配送费用
                $freight_price += get_freight_price($value['goods_id'],$address['city'],$value['pdt_desc'],$value['goods_number']);
            }
            //计算订单付款金额
            $data['payment_price'] = $order['total_price'] + $freight_price - $cpns_money - $point;
            //修改订单信息
            Db::name('order')->where(array('order_id'=>$order_id))->update($data);
            //修改数据后清除缓存
            \think\Cache::rm(session('user.id').'_order_'.$order_id);
        }
        
        //支付方式
        $pay_type = input('post.pay_type','');
        if (!$pay_type){return json(array('success'=>false,'info'=>'支付方式选择错误'));exit;} 
        //返回支付url
        switch ($pay_type) {
            //微信支付
            case 'wxpay':
                //判断手机微信端访问
                if(isMobile() !== false && isWeixin() !== false){
               
                 $orderInfo  = model('Common/Order')->where(['order_id'=>$order_id])->find();
                 $jssdkLogic = model('Common/JssdkLogic','logic');

                 $wxConfig          = $jssdkLogic->wxConfig;
                 $result            = $jssdkLogic->unifiedOrder($orderInfo,SITE_URL.url('Mobile/Payment/mobile_wxpay_notify_url'));
                 
                 $data['appId']     = $wxConfig['APPID'];
                 $data['timeStamp'] = time();
                 $data['nonceStr']  = $jssdkLogic->createNonceStr();
                 $data['package']   = "prepay_id=".$result['prepay_id'];
                 $data['signType']  = 'MD5';
                 $data['paySign']   = $result['sign'];
                 
                 api_ajaxReturn(1,'成功',$data);
                }
                break;
          
        }
        return json(array('success'=>true,'info'=>'','url'=>$url));
    }  

    //PC微信端扫码支付
    public function native_wxpay(){
        //获取订单id
        $order_id = request()->param('order_id');
        if (!$order_id){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //获取订单信息
        $order = get_order($order_id,session('user.id'));
        if (!$order){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        // 验证订单是否已支付
        if($order['is_state'] == 1){
            // 进来表示已支付
            $this->redirect('Payment/status?order_id='.$order_id);exit;
        }

        $notify = new \think\WxPay\NativePay();
        $input = new \think\WxPay\WxPayUnifiedOrder();
        $input->SetBody($order['order_id']);
        $input->SetAttach($order['order_sn']);
        //商户订单号 
        $out_trade_no = \think\WxPay\WxPayConfig::MCHID.date("YmdHis");
        $input->SetOut_trade_no($out_trade_no);    
        // $input->SetTotal_fee(1);  //1分钱测试
        $input->SetTotal_fee($order['payment_price'] * 100);  //总金额
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag($order_id);
        $notify_url = 'http://'.$_SERVER['HTTP_HOST'].'/index/Payment/native_wxpay_notify_url/';
        $input->SetNotify_url($notify_url); //通知地址 
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($order_id);
        $result = $notify->GetPayUrl($input);
        //判断接口返回数据
        if($result['return_code'] != 'SUCCESS'){
            return json(array('success'=>false,'info'=>$result['return_msg']));exit;
        }
        $url = $result["code_url"];
        //添加商户订单号到订单
        Db::name('order')->where(array('order_id'=>$order_id))->setField('out_trade_no',$out_trade_no);
        //修改数据后清除缓存
        \think\Cache::rm(session('user.id').'_order_'.$order_id);
        return view('pc_wxpay',array('result'=>$result,'url'=>$url,'order_id'=>$order_id));
    }  

    //PC端微信扫码支付通知回调
    public function native_wxpay_notify_url(){
        $xml = file_get_contents('php://input');
        $xmlObj = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
        $xmlArr = json_decode(json_encode($xmlObj),true);
        //状态
        if($xmlArr['result_code'] == 'SUCCESS'){ //数据库操作
            //记录支付文件信息
            $out_trade_no = $xmlArr['out_trade_no']; //订单号
            file_put_contents($_SERVER['DOCUMENT_ROOT'].'/static/paylog/wxpay_'.$out_trade_no.'.txt',$xml); 
            //处理数据库操作 例如修改订单状态 
            $order = Db::name('order')->field(true)->where(array('out_trade_no'=>$out_trade_no))->find();
            //拼接修改信息
            $data = array();
            $data['is_state'] = 1;
            $data['pay_type'] = 'wxpay';
            $data['pay_name'] = '微信支付(PC端)';
            $data['pay_time'] = time();
            //返回金额按分为单位
            $data['pay_price'] = intval($xmlArr['total_fee']) / 100;
            //修改商品发货状态
            $data['goods'] = unserialize($order['goods']);
            foreach ($data['goods'] as $key => $value) {
                //商品状态
                $value['is_state'] = 1;
                $data['goods'][$key] = $value;
            }
            $data['goods'] = serialize($data['goods']);
            if(Db::name('order')->where(array('order_id'=>$order['order_id']))->update($data) !== false){
                //记录订单日志
                orderLog($order['order_id'], $order['member_id'], '支付 '.$order['order_id'].' 订单,付款 '.$data['pay_price'].'元', 3);
                //修改数据后清除缓存
                \think\Cache::rm($order['member_id'].'_order_'.$order['order_id']);
                //判断订单是否使用优惠券
                if($order['item_id'] != 0){
                    //修改优惠券为已使用
                    $coupon = array();
                    $coupon['is_state'] = 1;
                    $coupon['use_time'] = time();
                    $coupon['order_id'] = $order['order_id'];
                    Db::name('coupon_items')->where(array('item_id'=>$order['item_id'],'member_id'=>$order['member_id']))->update($coupon);
                    //修改数据后清除缓存
                    \think\Cache::rm('member_coupon_'.$order['member_id']);
                }
                //判断订单是否使用菜币
                if($order['point'] != 0){
                    //减少会员菜币
                    Db::name('member')->where(array('id'=>$order['member_id']))->setDec('point',$order['point']);
                    //记录菜币
                    add_member_point_log('pay_order',$order['member_id'],'支付'.$order['order_id'].'订单,使用'.$order['point'].'菜币',2,$order['point']);
                }
                //下单赠送菜币
                add_point('pay_order',$order['member_id'],$order['total_price'],0,'支付'.$order['order_id'].'订单赠送');
                //返回成功给微信端 一定要带上不然微信会一直回调8次
                echo 'SUCCESS';exit;  
            }
        }else{ //失败
            return 'ERROR';exit;
        }
    }

    //手机微信端支付
    public function mobile_wxpay(){
        //获取订单id
        $order_id = request()->param('order_id');
        if (!$order_id){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //获取订单信息
        $order = get_order($order_id,session('user.id'));
        if (!$order){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        // 验证订单是否已支付
        if($order['is_state'] == 1){
            // 进来表示已支付
            $this->redirect('Payment/status?order_id='.$order_id);exit;
        }

        header('Content-Type: text/html; charset=utf-8');
        //①、获取用户openid
        $tools = new \think\WxPay\JsApiPay();
        $openId = $tools->GetOpenid();
        //②、统一下单
        $input = new \think\WxPay\WxPayUnifiedOrder();
        $input->SetBody($order['order_id']);        //商品描述
        $input->SetAttach($order['total_number']);      //附加数据 
        //商户订单号 
        $out_trade_no = \think\WxPay\WxPayConfig::MCHID.date("YmdHis");
        $input->SetOut_trade_no($out_trade_no); 
        // $input->SetTotal_fee(1);  //1分钱测试
        $input->SetTotal_fee($order['total_amoubnt'] * 100);  //总金额
        $input->SetTime_start(date("YmdHis"));  //交易起始时间
        $input->SetTime_expire(date("YmdHis", time() + 600));   //交易结束时间 
        $input->SetGoods_tag($order_id);   //商品标记 
        $notify_url = 'http://'.$_SERVER['HTTP_HOST'].'/index/Payment/mobile_wxpay_notify_url/';
        $input->SetNotify_url($notify_url); //通知地址 
        $input->SetTrade_type("JSAPI"); //交易类型
        $input->SetOpenid($openId);     //用户标识
        $WxPayApi = new \think\WxPay\WxPayApi();
        $order = $WxPayApi::unifiedOrder($input);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        //添加商户订单号到订单
        Db::name('order')->where(array('order_id'=>$order_id))->setField('out_trade_no',$out_trade_no);
        //修改数据后清除缓存
        \think\Cache::rm(session('user.id').'_order_'.$order_id);
        return view('mobile_wxpay',array('jsApiParameters'=>$jsApiParameters,'order_id'=>$order_id));
    }


    //ajax查询订单是否已支付
    public function ajax_ispay(){
      
        //获取订单id
        $order_id = input('post.order_id','');
        if (!$order_id){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //获取订单信息
        $order = get_order($order_id,session('user.id'));
        if (!$order){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        switch ($order['is_state']) {
            case '-1':
                    return json(array('success'=>false,'info'=>'订单未支付！'));exit;
                break;
            case '1':
                    return json(array('success'=>true,'info'=>'订单已支付！','url'=>url('Payment/status?order_id='.$order_id)));exit;
                break;
        }
    }

    //检测订单状态
    public function status(){
        //获取订单id
        $order_id = request()->param('order_id');
        if (!$order_id){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //获取订单信息
        $order = get_order($order_id,session('user.id'));
        if (!$order){return json(array('success'=>false,'info'=>'不存在的订单信息！'));exit;} 
        //更新用户session菜币
        if($order['point'] != 0){
            $point = Db::name('member')->where(array('id'=>session('user.id')))->value('point');
            session('user.point',$point);
        }
        switch ($order['is_state']) {
            case '0':
                    return view('error',array('list'=>$order));
                break;
            case '1':
                    return view('success',array('list'=>$order));
                break;
        }
    }

    

    //手机wap端微信支付通知回调
    public function mobile_wxpay_notify_url(){
        $xml    = file_get_contents('php://input');
        $xmlObj = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
        $xmlArr = json_decode(json_encode($xmlObj),true);
        //状态
        if($xmlArr['result_code'] == 'SUCCESS'){ //数据库操作
            //记录支付文件信息
            $out_trade_no = $xmlArr['out_trade_no']; //订单号
            //处理数据库操作 例如修改订单状态
            $order = Db::name('order')->field(true)->where(array('order_sn'=>$out_trade_no))->find();
            $orderLogic = model('Common/OrderLogic', 'logic');
            $res = $orderLogic->updatePayOrder($order['order_id'],  'wxpay', '微信');
            if($res['status']==1){
                // 分红奖励
                $aa = model('Common/User','logic')->paySuccess($order['user_id'], $order['order_id']);
                return 'SUCCESS';exit;
            }
        }
        file_put_contents($_SERVER['DOCUMENT_ROOT'].'/public/paylog/wxpay_'.$out_trade_no.'.txt',json_encode($xmlObj));
        return 'ERROR';exit;

    }

    //手机wap端微信充值回调通知
    public function recharge_money_notify_url()
    {
        $xml = file_get_contents('php://input');
        $xmlObj = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
        $xmlArr = json_decode(json_encode($xmlObj),true);
        $out_trade_no = $xmlArr['out_trade_no']; //订单号
        //状态
        if($xmlArr['result_code'] == 'SUCCESS'){ //数据库操作
            //处理数据库操作 例如修改订单状态
            $order = Db::name('order')->field(true)->where(array('out_trade_no'=>$out_trade_no))->find();
            //拼接修改信息
            $data = array();
            $data['pay_status'] = 1;
            $data['pay_time'] = time();
            //启动事务
            trans();
            $Member = new \app\common\model\Member();
            if(Db::name('order')->where(array('order_id'=>$order['order_id']))->update($data)
                &&
                //把充值的余额给用户
                $Member->updateMoney($order['member_id'], $order['total_amount'], 6, 'order', $order['order_id'])
            ){
                // 提交事务
                trans('commit');
                //返回成功给微信端
                echo 'SUCCESS';
                exit;
            }
            //回滚事务
            trans('rollback');
        }else{ //失败
            file_put_contents($_SERVER['DOCUMENT_ROOT'].'/static/paylog/wxpay_'.$out_trade_no.'.txt',$xml);
            return 'ERROR';exit;
        }
    }



}
